/*
 * rust 原生类型(primitives)，包括：
 * 标量类型(scalar type)
 *  - 有符号整数：i8, i16, i32, i64, i128 和 isize（指针宽度）
 *  - 无符号整数：u8, u16, u32, u64, u128 和 usize (指针宽度)
 *  - 浮点数：f32, f64
 *  - char：单个Unicode 字符，如 'a', '∞' （每个都是4字节）
 *  - bool： 只能是true 或 false
 *  - 单元类型： () 唯一可能的值就是 `()` 这个空元组
 *
 * 复合类型(compound type)
 *  - 数组：如[1, 2, 3]
 *  - 元组：如 (1, true)
 *
 * 变量都能够显示地给出类型说明。数字还可以通过后缀或默认方式来声明类型。整型默认为
 * i32 类型，浮点型默认为 f64 类型。rust 还可以根据上下文来推断类型。
 */

fn main() {
    // 变量可以给出类型说明
    let logical: bool = true;

    let a_float: f64 = 1.0; // 常规说明
    let an_integer = 5i32; // 后缀说明

    // 否则俺默认方式决定类型
    let default_float = 3.0; // `f64`
    let default_integer = 7; // `i32`

    // 可以根据上下文自动推断
    let mut inferred_type = 12; // 根据下一行的赋值推断为 i64 类型
    inferred_type = 4294967296i64;

    // 可变的(mutable)变量，其值可以改变
    let mut mutable = 12; // `i32`
    mutable = 21;

    // 报错， 变量的类型不可以改变。
    //mutable = true;

    // 但可以用遮蔽（shadow）来覆盖前面的变量
    let mutable = true;

}